<?php
/**
 * Мехнизм добавления и редактирования заказа
 * 
 * 
 */
// список ошибок при валидации формы и других действий пользователя
$errors = array();

// добавляем CSS для обображения заказов (переопределяются некоторые CSS из основного ./index.css файла
$layout->AddCSS('/admin/mods/order/order.css');
// добавляем JS файлы 
$layout->AddJS('/admin/jscss/jquery.maskedinput-1.3.js');
$layout->AddJS('/admin/mods/order/edit.js');


// заказ по умолчанию
$order = new Sbm\Order();
$order->time = time();
$order->customer_time = strtotime("+1 day");


//{{{ Если заказ редактируется

if ( !empty($_REQUEST['id']) )
{
	// Ищем заказ по ID
	$search = new Sbm\OrderSearch($db);
	if ( $orders = $search->GetById($_REQUEST['id']) )
	{
		$order = current($orders);
	}
	else
	{
		$errors[] = "Не возможно найти заказ с этим номером.";
		trigger_error("Can't find orderno '" . $_REQUEST['id'] . "'", E_USER_WARNING);
	}
}

//}}}
//{{{ форма, заполненная по умолчанию

$form = array(
	'id' => isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : NULL,
	'equipment' => isset($_POST['equipment']) ? trim($_POST['equipment']) : $order->equipment->GetName(),
	'defect' => isset($_POST['defect']) ? trim($_POST['defect']) : $order->defect,
	'profession' => isset($_POST['profession']) ? trim($_POST['profession']) : $order->profession->GetName(),
	'customer_date' => isset($_POST['customer_date']) ? trim($_POST['customer_date']) : strftime("%d.%m.%Y", $order->customer_time),
	'customer_time' => isset($_POST['customer_time']) ? trim($_POST['customer_time']) : strftime("%H:%M:%S", $order->customer_time),
	'customer_phone' => isset($_POST['customer_phone']) ? trim($_POST['customer_phone']) : $order->phone,
	'customer_address' => isset($_POST['customer_address']) ? trim($_POST['customer_address']) : $order->address,
	'region' => isset($_POST['region']) ? trim($_POST['region']) : $order->region->GetName(),
	'todo' => isset($_POST['todo']) ? $_POST['todo'] : 'edit-this',
);

//}}}
// Если пользователь отправил заполенную форму
// проверяем правильность заполнения формы и сразу заполняем объект $order
if ( !empty($_POST) )
{

	//{{ находим или добавляем оборудование
	if ( validate_equipment($form['equipment']) )
	{
		$order->equipment = get_auto_equipment($db, $form['equipment']);
	}
	else
	{
		$errors[] = "Не правильно заполенено оборудование";
	}
	//}}
	//{{ находим или добавляем профессию
	if ( validate_profession($form['profession']) )
	{
		$order->profession = get_auto_profession($db, $form['profession']);
	}
	else
	{
		$errors[] = "Не правильно заполенена профессия";
	}
	//}}
	//{{{ Проверяем дату и время

	$datetime = sprintf("%s %s", trim($form['customer_date']), trim($form['customer_time']));
	if ( $datetime = validate_datetime($datetime) )
	{
		$order->customer_time = strtotime($datetime);
	}
	else
	{
		$errors[] = "Не правильно указана дата или время";
	}

	//}}}
	//{{{ Проверяем телефон

	if ( validate_phone($form['customer_phone']) )
	{
		$order->phone = $form['customer_phone'];
	}
	else
	{
		$errors[] = "Не правильно указан телефон";
	}

	//}}}
	//{{{ Проверяем ввод региона

	if ( $region = validate_region($db, $form['region']) )
	{
		$order->region = $region;
	}
	else
	{
		$errors[] = "Не правильно указан микрорайон";
	}

	//}}}
	//{{{ Проверяем остальные поля

	$order->defect = $form['defect'];
	$order->address = $form['customer_address'];

	//}}}


	if ( !$errors )
	{
		///{{{ Определяем статус изменения заказа

		if ( isset($_REQUEST['id']) )
		{
			$order->SetStatus('edit');
			$order->status_description = 'Отредактирован оператором %operator_name%';
		}
		else
		{
			$order->SetStatus('insert');
			$order->status_description = 'Добавлен оператором %operator_name%';
		}

		//}}}
		// Сохраняем заказ
		if ( $id = $order->Save($db) )
		{
			$form['id'] = $id;
			// ставим отметку, что заказ сохранён
			$layout->SetMessage($_REQUEST['id'] ? 'Заказ сохранён' : 'Новый заказ добавлен' );

			$form['todo'] = 'send';

			if ( $form['todo'] == 'send' )
			{
				// делаем ридеркт, на страницу отправки заказа
				header("Location: ./?mod=" . $mod . "&act=send&id=" . $form['id']);
			}
			else
			{
				// делаем ридеркт, по обычным правилам (@see layout.php)
				$layout->RedirectTodo($form['todo'], $id);
			}
		}
		else
		{
			trigger_error('При сохранении заказа произошла ошибка. Обратитесь к администратору.', E_USER_ERROR);
		}
		exit();
	}
}

if ( $errors )
{
	$layout->SetErrors($errors);
}


/** ========================================================================================================= */

/**
 * Проверяем правильность строки с датой и временем от пользователя
 * 
 * @param $string
 * @return boolean
 */
function validate_datetime( $string )
{
	if ( preg_match("/^(\d{2})\.(\d{2})\.(\d{4}) (\d{2}:\d{2}:\d{2})$/", $string, $m) )
	{
		return sprintf("%s-%s-%s %s", $m[3], $m[2], $m[1], $m[4]);
	}
	else
	{
		return false;
	}
}

/**
 * 
 * @param $string
 * @return unknown_type
 */
function validate_phone( $string )
{
	$string = trim($string);
	if ( preg_match("/^8-\d{3}\-\d{3}-\d{4}$/", $string) )
	{
		return $string;
	}
	else
	{
		return false;
	}
}

/**
 * Возвращает true если оборудование введено верно
 *  
 * @param string $string
 * @return boolean
 */
function validate_equipment( $string )
{
	return trim($string);
}

/**
 * Возвращает true если профессия введена верно введено верно
 *  
 * @param string $string
 * @return boolean
 */
function validate_profession( $string )
{
	return trim($string);
}

/**
 * Првоеряет введённое имя региона на наличие в базе данных
 * 
 * @param DB $db
 * @param string $string
 * @return Region or false
 */
function validate_region( $db, $string )
{
	$search = new Sbm\RegionSearch($db);
	$list = $search->GetByName($string);
	if ( $list )
	{
		return current($list);
	}
	else
	{
		return false;
	}
}

/**
 * Возвращает объект профессии.
 * Если профессии в списке нет, то в БД создаётся новая профессия
 * 
 * @param DB $db
 * @param string $string
 * @return Profession
 */
function get_auto_profession( $db, $name )
{
	$search = new Sbm\ProfessionSearch($db);
	$list = $search->GetByName($name);
	if ( $list )
	{
		$profession = current($list);
	}
	else
	{
		$profession = new Sbm\Profession();
		$profession->title = $name;
		$profession->Save($db);
	}
	return $profession;
}

/**
 * Возвращает объект одорудование.
 * Исли оборудования в списке нет, то в БД создаётся новое оборудование
 * 
 * @param DB $db
 * @param string $string
 * @return Equipment
 */
function get_auto_equipment( $db, $name )
{
	$search = new Sbm\EquipmentSearch($db);
	$list = $search->GetByName($name);
	if ( $list )
	{
		$equipment = current($list);
	}
	else
	{
		$equipment = new Equipment();
		$equipment->title = $name;
		$equipment->Save($db);
	}
	return $equipment;
}

?>